package view;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.text.TextAlignment;
import model.IliasFile;
import model.IliasTreeNode;
import model.persistance.IliasTreeProvider;
import model.persistance.Settings;
import control.LocalFileStorage;
import download.IliasPdfDownloadCaller;
public class ResultList extends ListView<IliasTreeNode> {
private final Dashboard dashboard;
private final GridPane headerPane;
private final Label listHeader;
private final ObservableList<IliasTreeNode> items;
private final BorderPane listPane;
public ResultListMode listMode;
private ContextMenu menu;
enum ResultListMode {
IGNORE_MODE, SEARCH_MODE, PDF_NOT_SYNCHRONIZED;
}
public ResultList(Dashboard dashboard) {
super();
this.dashboard = dashboard;
setMinWidth(260);
listHeader = new Label();
listHeader.setId("listHeaderTextNormal");
listHeader.setTextAlignment(TextAlignment.CENTER);
headerPane = new GridPane();
listPane = new BorderPane();
headerPane.setId("listHeaderNormal");
listPane.setCenter(this);
listPane.setTop(headerPane);
headerPane.add(listHeader, 0, 0);
menu = new ContextMenu();
setId("listView");
items = FXCollections.observableArrayList();
setItems(items);
getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2
&& Settings.getInstance().getFlags().isUserLoggedIn()) {
new Thread(new IliasPdfDownloadCaller(((ResultList) event.getSource())
.getSelectionModel().getSelectedItem())).start();
} else {
showContextMenu(event);
}
};
});
setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
handleKeyEvents(event);
};
});
}
private void handleKeyEvents(KeyEvent event) {
if (event.getCode() == KeyCode.DELETE && listMode.equals(ResultListMode.IGNORE_MODE)) {
final IliasFile file = (IliasFile) getSelectionModel().getSelectedItem();
Settings.getInstance().toggleFileIgnored(file);
dashboard.pdfIgnoredStateChanged(file);
pdfIgnoredStateChanged(file);
getSelectionModel().selectNext();
} else if (event.getCode() == KeyCode.UP || event.getCode() == KeyCode.DOWN) {
final IliasTreeNode selectedDirectory = ((ResultList) event.getSource())
.getSelectionModel().getSelectedItem();
dashboard.getCoursesTreeView().selectFile((IliasFile) selectedDirectory);
} else if (event.getCode() == KeyCode.ENTER
&& Settings.getInstance().getFlags().isUserLoggedIn()) {
new Thread(new IliasPdfDownloadCaller(getSelectionModel().getSelectedItem())).start();
}
}
private void showContextMenu(MouseEvent event) {
menu.hide();
final List<IliasTreeNode> selectedNodes = ((ResultList) event.getSource())
.getSelectionModel().getSelectedItems();
if (selectedNodes.isEmpty() || selectedNodes == null) {
return;
}
if (selectedNodes.size() == 1) {
dashboard.getCoursesTreeView().selectFile((IliasFile) selectedNodes.get(0));
}
if (event.getButton() == MouseButton.SECONDARY) {
menu = new FileContextMenu(dashboard).createMenu(selectedNodes, event);
menu.show(this, event.getScreenX(), event.getScreenY());
}
}
public void pdfIgnoredStateChanged(IliasFile file) {
dashboard.setNumberofIngoredPdfs(getIgnoredIliasPdfs().size());
dashboard.setNumberOfUnsynchronizedPdfs(getUnsynchronizedPdfs().size());
if (listMode != ResultListMode.IGNORE_MODE) {
return;
}
if (file.isIgnored()) {
if (!items.contains(file)) {
items.add(file);
}
} else {
items.remove(file);
}
}
public void fileSynchronizedStateChanged(IliasFile file) {
dashboard.setNumberofIngoredPdfs(getIgnoredIliasPdfs().size());
dashboard.setNumberOfUnsynchronizedPdfs(getUnsynchronizedPdfs().size());
if (listMode != ResultListMode.PDF_NOT_SYNCHRONIZED) {
return;
}
showUnsynchronizedPdfs();
}
public void refresh() {
if (listMode == ResultListMode.IGNORE_MODE) {
showIgnoredFiles();
} else if (listMode == ResultListMode.PDF_NOT_SYNCHRONIZED) {
showUnsynchronizedPdfs();
} else if (listMode == ResultListMode.SEARCH_MODE) {
showPdfMatches(dashboard.getSearchFieldInput());
}
dashboard.setNumberofIngoredPdfs(getIgnoredIliasPdfs().size());
dashboard.setNumberOfUnsynchronizedPdfs(getUnsynchronizedPdfs().size());
}
public void showIgnoredFiles() {
listMode = ResultListMode.IGNORE_MODE;
items.clear();
ArrayList<IliasFile> ignoredPdf = getIgnoredIliasPdfs();
setListHeader(" Ignorierte Dateien", "red");
for (IliasFile pdf : ignoredPdf) {
items.add(pdf);
}
dashboard.setStatusText(ignoredPdf.size() + " ignorierte Dateien in Ignorieren-Liste.",
false);
dashboard.setNumberofIngoredPdfs(ignoredPdf.size());
}
public ArrayList<IliasFile> getIgnoredIliasPdfs() {
final List<IliasFile> allFiles = IliasTreeProvider.getAllIliasFiles();
ArrayList<IliasFile> ignoredFiles = new ArrayList<IliasFile>();
for (IliasFile file : allFiles) {
if (file.isIgnored()) {
ignoredFiles.add(file);
}
}
return ignoredFiles;
}
protected void showUnsynchronizedPdfs() {
listMode = ResultListMode.PDF_NOT_SYNCHRONIZED;
final List<IliasFile> allFiles = IliasTreeProvider.getAllIliasFiles();
final List<IliasFile> unsynchronizedFiles = new ArrayList<IliasFile>();
final Set<Integer> allLocalFileSizes = LocalFileStorage.getInstance()
.getAllLocalFileSizes();
for (IliasFile file : allFiles) {
if (file.isIgnored()) {
continue;
}
if (!allLocalFileSizes.contains(file.getSize())) {
unsynchronizedFiles.add(file);
}
}
dashboard.setStatusText("Gesamt: " + allFiles.size() + ", davon sind "
+ unsynchronizedFiles.size() + " noch nicht im Ilias Ordner.", false);
setListHeader(" Lokal nicht vorhandene Dateien ", "");
dashboard.setNumberOfUnsynchronizedPdfs(unsynchronizedFiles.size());
items.clear();
for (IliasFile file : unsynchronizedFiles) {
items.add(file);
}
}
protected List<IliasFile> getUnsynchronizedPdfs() {
final List<IliasFile> allFiles = IliasTreeProvider.getAllIliasFiles();
final List<IliasFile> unsynchronizedPdfs = new ArrayList<IliasFile>();
final Set<Integer> allLocalPdfSizes = LocalFileStorage.getInstance().getAllLocalFileSizes();
for (IliasFile file : allFiles) {
if (file.isIgnored()) {
continue;
}
if (!allLocalPdfSizes.contains(file.getSize())) {
unsynchronizedPdfs.add(file);
}
}
return unsynchronizedPdfs;
}
public void showPdfMatches(String inputString) {
listMode = ResultListMode.SEARCH_MODE;
items.clear();
if (inputString.length() == 0 || inputString.equals(" ")) {
setListHeader(" Gefundene Dateien " + "(" + String.valueOf(0) + ")", "green");
return;
}
final List<IliasFile> allFiles = IliasTreeProvider.getAllIliasFiles();
if (allFiles.isEmpty()) {
dashboard.setStatusText("Keine passende Datei gefunden.", false);
return;
}
dashboard.setStatusText("");
List<IliasFile> alreadyAddedFile = new ArrayList<IliasFile>();
for (IliasFile file : allFiles) {
if (file.isIgnored()) {
continue;
}
final String[] splitedStrings = file.getName().split(" ");
for (int i = 0; i < splitedStrings.length; i++) {
splitedStrings[i] = (splitedStrings[i] + " ").toLowerCase();
}
for (int i = 0; i < splitedStrings.length; i++) {
if (splitedStrings[i].startsWith(inputString.toLowerCase())
&& !alreadyAddedFile.contains(file)) {
alreadyAddedFile.add(file);
continue;
}
if (inputString.contains(" ")
&& file.getName().toLowerCase().contains(inputString.toLowerCase())
&& !alreadyAddedFile.contains(file)) {
alreadyAddedFile.add(file);
continue;
}
if (splitedStrings[i].toLowerCase().contains(inputString.toLowerCase())
&& !alreadyAddedFile.contains(file)) {
alreadyAddedFile.add(file);
continue;
}
if (file.getParentFolder() != null) {
if (inputString.length() > 3
&& file.getParentFolder().getName().toLowerCase()
.contains(inputString.toLowerCase())
&& !alreadyAddedFile.contains(file)) {
alreadyAddedFile.add(file);
}
continue;
}
if (file.getParentFolder().getParentFolder() != null) {
if (inputString.length() > 3
&& file.getParentFolder().getParentFolder().getName().toLowerCase()
.contains(inputString.toLowerCase())
&& !alreadyAddedFile.contains(file)) {
alreadyAddedFile.add(file);
}
continue;
}
}
}
setListHeader(" Gefundene Dateien " + "(" + String.valueOf(alreadyAddedFile.size()) + ")",
"green");
if (alreadyAddedFile.isEmpty()) {
dashboard.setStatusText("Keine Datei gefunden.");
} else {
for (IliasFile file : alreadyAddedFile) {
items.add(file);
}
}
}
private void setListHeader(String text, String color) {
listHeader.setText(text);
if (color.equals("red")) {
headerPane.setId("listHeaderIgnored");
listHeader.setId("listHeaderTextIgnored");
} else if (color.equals("green")) {
headerPane.setId("listHeaderSearch");
listHeader.setId("listHeaderTextSearch");
} else {
headerPane.setId("listHeaderNormal");
listHeader.setId("listHeaderTextNormal");
}
}
protected BorderPane getPane() {
return listPane;
}
}